package com.wrk._2_数组._01_课件;

import java.util.Arrays;

public class _007_稀疏数组 {
    public static void main(String[] args) {
        //1、用数组表示棋盘  11*11   1:黑棋   2:白棋
        int [][] array = new int[11][11];
        //为数组赋值，模拟棋盘
        array[1][2] = 1;
        array[2][3] = 2;
        //输出原始数组
        System.out.println("输出原始数组为：");
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("分割线==================================");
        //2、获取原始数组有效元素的个数
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] !=0){
                    count++;
                }
            }
        }
        //3、创建一个稀疏数组
        int [][] array1 = new int[count+1][3];//列数是固定的，行数是有效元素的个数+表头占用的一行
        //输出表头
        System.out.println("转换成稀疏数组为：");
        System.out.println("行"+"\t"+"列"+"\t"+"值");
        //为系数数组，第一行赋值
        array1[0][0] = 11;
        array1[0][1] = 11;
        array1[0][2] = count;
        //遍历原始数组，有效元素赋值给新的稀疏数组
        int sum =0;
        for (int a = 0; a < array.length; a++) {
            for (int b = 0; b < array[a].length; b++) {
                if (array[a][b] != 0){
                    sum++;
                    array1[sum][0] = a;             //记录行坐标
                    array1[sum][1] = b;             //记录列坐标
                    array1[sum][2] = array[a][b];   //记录值
                }
            }
        }
        //4、输出稀疏数组
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                System.out.print(array1[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("分割线==================================");
        //5、稀疏数组还原为原始数组
        //创建一个还原后的数组，行  列  直接从稀疏数组里面取
        int [][] array2 = new int[array1[0][0]][array1[0][1]];
        //遍历稀疏数组，将结果存入新的数组
        for (int i = 1; i < array1.length; i++) {                  //为什么i=1，应为0行存的为表头信息
            //新数组的横坐标就是array1[i][0]，纵坐标就是array1[i][1]
            array2[array1[i][0]][array1[i][1]] = array1[i][2];
        }
        System.out.println("稀疏数组还原后的数组为：");
        //遍历还原后的数组，输出
        for (int i = 0; i < array2.length; i++) {
            for (int j = 0; j < array2[i].length; j++) {
                System.out.print(array2[i][j]+"\t");
            }
            System.out.println();
        }
    }
}
